<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>理解使用函数实现历史记录--提高性能</title>
</head>
<body>
<script>
//    var count=0;
//    var fibonacci=function(n){
//        count++;
//        return n<2?n:fibonacci(n-1)+fibonacci(n-2);
//    };
//    for(var i=0;i<=10;i+1){
//        console.log(i+":"+fibonacci(i));
//    }
//    console.log(count);
//   先使用一个临时数组保存存储结果，当函数被调用的时候，先看是否已经有存储结果 如果有的话，就立即返回这个存储结果，否则的话，调用函数运算下；代码如下：
//    var count2=0;
//    var fibonacci2=(function(){
//        var memo=[0,1];
//        var fib=function(n){
//            var result=memo[n];
//            count2++;
//            if(typeof result !=='number'){
//                result=fib(n-1)+fib(n-2);
//                memo[n]=result;
//            }
//            return result;
//        };
//        return fib;
//    })();
//    for(var j=0;j<=10;j+1){
//        console.log(j+":"+fibonacci2(j));
//    }
//    console.log(count2);
    var count3=0;
    var memoizer=function(memo,formula){
        var recur=function(n){
            var result=memo[n];
            count3++;
            if(typeof result!=='number'){
                result=formula(recur,n);
                memo[n]=result;
            }
            return result;
        };
        return recur;
    };
    var fibonacci3=memoizer([0,1],function(recur,n){
        return recur(n-1)+recur(n-2);
    });
    //调用方式如下
    for(var k=0;k<=10;k+=1){
        console.log(k+":"+fibonacci3(k));
    }
    console.log(count3);
</script>
</body>
</html>